/*
 * @Author: wuqingchun
 * @Date: 2024-07-23 11:28:58
 * @Description: 
 * @LastEditors: wuqingchun
 * @LastEditTime: 2024-07-26 16:46:04
 */
#ifndef __SPAN_H__
#define __SPAN_H__

#include <cstddef>

/**
 * 在操作系统和计算机内存管理中，‌span可以指代一块连续的内存区域，‌这块内存区域可以被操作系统用来分配给进程使用。
 * ‌当进程需要更多内存时，‌操作系统会从物理内存中划分出一定大小的内存块（‌即span）‌分配给该进程。‌
 * 这种管理方式允许操作系统更灵活地分配和释放内存，‌从而提高内存的使用效率。‌
 * 
 */

/**
 * @brief span 描述是以页为单位的大块内存的
 * 
 */
struct Span
{
    /* data */
    size_t ulPageID;  // 页号
    size_t ulPageNum; // 页数量
    
    Span* pstPrev = nullptr;
    Span* pstNext = nullptr;

    size_t ulObjSize;  // 该内存块中保存的对象的大小
    size_t ulUseCount = 0;
    void*  pFreeList = nullptr;
    bool  bIsUse = false;      // span 对象是否被使用
};


class SpanList
{
private:
    /* data */
public:
    SpanList()
    {
        m_stHead.pstPrev = &m_stHead;
        m_stHead.pstNext = &m_stHead;
    }

    ~SpanList()
    {

    }

    Span* Begin()
    {
        return m_stHead.pstNext;
    }

    Span* End()
    {
        return &m_stHead;
    }

    bool Empty()
    {
        return m_stHead.pstNext == &m_stHead;
    }

    Span* PopFront()
    {
        Span* pstHead = m_stHead.pstNext;
        m_stHead.pstNext = pstHead->pstNext;
        m_stHead.pstNext->pstPrev = &m_stHead;

        pstHead->pstNext = nullptr;
        pstHead->pstPrev = nullptr;

        return pstHead;
    }

    void PushFront(Span* pstSpan)
    {
        __Add(&m_stHead, pstSpan, m_stHead.pstNext);
    }
private:
    void __Add(Span* pstPrev, Span* pstNew, Span* pstNext)
    {
        pstNew->pstNext = pstNext;
        pstNew->pstPrev = pstPrev;

        pstNext->pstPrev = pstNew;
        pstPrev->pstNext = pstNew;
    }
private:
    Span m_stHead;
};


#endif //__SPAN_H__